package com.regent.central.bill.repository;

import com.regent.central.bill.core.DeliveryGoods;
import com.regent.central.bill.dto.sale_order.SaleOrderDetailDeliveryGoodsDTO;
import com.regent.central.bill.dto.sale_order.SaleOrderListDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Repository
public interface DeliveryGoodsMapper extends Mapper<DeliveryGoods> {

    /**
     * 查询是否发过此货品
     *
     * @param unitId
     * @param styleId
     * @return
     */
    DeliveryGoods selectDeliveryGoods(@Param("unitId") String unitId, @Param("style_id") String styleId);

    /**
     * 获取指定销售单的发货总数
     *
     * @param saleOrderId 销售单ID
     * @return 该销售单的发货总数
     */
    BigDecimal getDeliveryGoodsTotal(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取销售单详情发货货品列表
     *
     * @param saleOrderId 销售单ID
     * @return 销售单详情发货货品列表
     */
    List<SaleOrderDetailDeliveryGoodsDTO> getSaleOrderDetailDeliveryGoods(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取销售单的某款货的发货记录
     *
     * @param styleId      款号ID
     * @param saleOrderIds 销售单ID
     * @return 销售单的某款货的发货记录
     */
    List<SaleOrderListDTO> getSaleOrderStyleDeliveriesIn(
            @Param("styleId") String styleId,
            @Param("saleOrderIds") String... saleOrderIds
    );

    /**
     * 撤销发货货品记录
     *
     * @param deliveryGoodsIds 发货货品记录ID
     * @param userCanceled     撤销人
     * @param dateCanceled     撤销时间
     */
    void cancel(
            @Param("userCanceled") String userCanceled,
            @Param("dateCanceled") Date dateCanceled,
            @Param("deliveryGoodsIds") String... deliveryGoodsIds
    );

    /**
     * 获取某个销售单的指定style发货货品列表
     *
     * @param saleOrderId 销售单ID
     * @param styleId     款号ID
     * @return 某个销售单的指定style发货货品列表
     */
    List<DeliveryGoods> getSaleOrderDeliveryGoodsOfStyle(
            @Param("saleOrderId") String saleOrderId,
            @Param("styleId") String styleId
    );

    /**
     * 获取销售单的发货货品列表
     *
     * @param saleOrderId 销售单ID
     * @param canceled    已撤销
     * @param deleted     已删除
     * @return 销售单的发货货品列表
     */
    List<DeliveryGoods> getSaleOrderDeliveryGoods(
            @Param("saleOrderId") String saleOrderId,
            @Param("canceled") Boolean canceled,
            @Param("deleted") Boolean deleted
    );

}